import { lookupCollection, lookupCollections } from '@iconify/json';
import fs from 'fs-extra';
import inquirer from 'inquirer';
import { exec } from 'node:child_process';
import path from 'node:path';
import process from 'node:process';

async function generateIcons() {
  // 拿到全部图标集的原始数据
  const raw = await lookupCollections();

  let lastChoose = fs.readFileSync(path.resolve(process.cwd(), 'src/iconify/index.json'), 'utf-8');
  lastChoose = JSON.parse(lastChoose);

  // 取出可使用的图标集数据用于 inquirer 选择，并按名称排序
  const collections = Object.entries(raw)
    .map(([id, item]) => ({
      ...item,
      id,
    }))
    .sort((a, b) => a.name.localeCompare(b.name));

  /**
   * 分别会在对应目录下生成以下文件，其中(1)(3)用于离线下载并安装图标，(2)用于图标选择器使用
   * (1) src/iconify/index.json    记录用户 inquirer 的交互信息
   * (2) src/iconify/data.json     包含多个图标集数据，仅记录图标名
   * (3) public/icons/*-raw.json   多个图标集的原始数据，独立存放，用于离线使用
   */
  inquirer
    .prompt([
      {
        type: 'checkbox',
        message: '请选择需要生成的图标集',
        name: 'collections',
        choices: collections.map((item) => ({
          name: `${item.name} (${item.total} icons)`,
          value: item.id,
        })),
        default: lastChoose.collections,
      },
      {
        type: 'confirm',
        name: 'isOfflineUse',
        message: '是否需要离线使用',
        default: false,
      },
    ])
    .then(async (answers) => {
      await fs.writeJSON(path.resolve(process.cwd(), 'src/iconify/index.json'), {
        collections: answers.collections,
        isOfflineUse: answers.isOfflineUse,
      });

      const outputDir = path.resolve(process.cwd(), 'public/icons');
      await fs.ensureDir(outputDir);
      await fs.emptyDir(outputDir);

      const collectionsMeta: object[] = [];
      for (const info of answers.collections) {
        const setData = await lookupCollection(info);

        collectionsMeta.push({
          prefix: setData.prefix,
          info: setData.info,
          icons: Object.keys(setData.icons),
        });

        const offlineFilePath = path.join(outputDir, `${info}-raw.json`);

        if (answers.isOfflineUse) {
          await fs.writeJSON(offlineFilePath, setData);
        }
      }

      await fs.writeJSON(path.resolve(process.cwd(), 'src/iconify/data.json'), collectionsMeta);

      exec('eslint src/iconify/data.json src/iconify/index.json --cache --fix');
    });
}

generateIcons();
